home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / server1.zip / _SRVMODS.PAT < prev    next >
Text File  |  1996-09-07  |  21KB  |  625 lines

  1. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/buttons.qc qc/buttons.qc
  2. --- qc-ori/buttons.qc    Sat Aug 17 00:00:00 1996
  3. +++ qc/buttons.qc    Sat Sep  7 00:00:00 1996
  4. @@ -55,6 +55,7 @@
  5.  {
  6.      if (other.classname != "player")
  7.          return;
  8. +    if (other.player_status & PLAYER_IS_OBSERVER) return; //#jp#(Observer)
  9.      self.enemy = other;
  10.      button_fire ();
  11.  };
  12. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/client.qc qc/client.qc
  13. --- qc-ori/client.qc    Sat Aug 17 00:00:00 1996
  14. +++ qc/client.qc    Sat Sep  7 00:00:00 1996
  15. @@ -53,6 +53,7 @@
  16.      parm7 = self.ammo_cells;
  17.      parm8 = self.weapon;
  18.      parm9 = self.armortype * 100;
  19. +        parm16 = self.player_status; //#jp#(PlayerStatus)
  20.  };
  21.  
  22.  void() SetNewParms =
  23. @@ -66,15 +67,20 @@
  24.      parm6 = 0;
  25.      parm8 = 1;
  26.      parm9 = 0;
  27. +        parm16 = 0; //#jp#(PlayerStatus)
  28.  };
  29.  
  30.  void() DecodeLevelParms =
  31.  {
  32. +        self.player_status = parm16;            //#jp#(PlayerStatus)
  33. +        SkinRestoreSkinFromStatusFlag(self);        //#jp#(Skin)
  34. +if (!USE_MODULE_OBSERVER) {                //#jp#(Observer)
  35.      if (serverflags)
  36.      {
  37.          if (world.model == "maps/start.bsp")
  38.              SetNewParms ();        // take away all stuff on starting new episode
  39.      }
  40. +}                            //#jp#(Observer)
  41.      
  42.      self.items = parm1;
  43.      self.health = parm2;
  44. @@ -143,6 +149,7 @@
  45.  // skip any text in deathmatch
  46.      if (deathmatch)
  47.      {
  48. +        LevelSelectSelectLevel(); //#jp#(LevelSelect)
  49.          GotoNextMap ();
  50.          return;
  51.      }
  52. @@ -288,6 +295,11 @@
  53.      if (other.classname != "player")
  54.          return;
  55.  
  56. +if (ExitRulesExitingIsNotAllowed(other)) {    //#jp#(ExitRules)
  57. +   T_Damage (other, world, other, 50000);    //#jp#(ExitRules)
  58. +   return;                    //#jp#(ExitRules)
  59. +}                        //#jp#(ExitRules)
  60. +
  61.      if (cvar("noexit"))
  62.      {
  63.          T_Damage (other, self, self, 50000);
  64. @@ -343,7 +355,9 @@
  65.      if (coop)
  66.      {
  67.          // make a copy of the dead body for appearances sake
  68. +   if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  69.          CopyToBodyQue (self);
  70. +   }//#jp#(Observer)
  71.          // get the spawn parms as they were at level start
  72.          setspawnparms (self);
  73.          // respawn        
  74. @@ -352,15 +366,24 @@
  75.      else if (deathmatch)
  76.      {
  77.          // make a copy of the dead body for appearances sake
  78. +   if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  79.          CopyToBodyQue (self);
  80. +   }//#jp#(Observer)
  81.          // set default spawn parms
  82.          SetNewParms ();
  83. +        parm16 = self.player_status; //#jp#(PlayerStatus)
  84.          // respawn        
  85.          PutClientInServer ();
  86.      }
  87.      else
  88.      {    // restart the entire server
  89. +   if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  90.          localcmd ("restart\n");
  91. +   } else {                //#jp#(Observer)
  92. +      SetNewParms();            //#jp#(Observer)
  93. +      parm16 = self.player_status;    //#jp#(Observer)//#jp#(PlayerStatus)
  94. +      PutClientInServer ();        //#jp#(Observer)
  95. +   }                    //#jp#(Observer)
  96.      }
  97.  };
  98.  
  99. @@ -379,6 +402,12 @@
  100.      set_suicide_frame ();
  101.      self.modelindex = modelindex_player;
  102.      self.frags = self.frags - 2;    // extra penalty
  103. +        RankCountEvent(self,RANK_SUICIDE);        //#jp#(Rank)
  104. +    ServerConsoleClientSuicide(self);               //#jp#(ServerConsole)
  105. +        if (KickSuicider(self)) return;            //#jp#(KickSuicider)
  106. +        if (self.player_status & PLAYER_IS_OBSERVER) {    //#jp#(Observer)
  107. +           self.observer_status = OBSERVER_BECOME_OBSERVER;//#jp#(Observer)
  108. +        }                        //#jp#(Observer)
  109.      respawn ();
  110.  };
  111.  
  112. @@ -479,7 +508,26 @@
  113.  // paustime is set by teleporters to keep the player from moving a while
  114.      self.pausetime = 0;
  115.      
  116. +if (!self.kick_suicider_lasttime)                //#jp#(KickSuicider)
  117. +   self.kick_suicider_lasttime = time - 100000;            //#jp#(KickSuicider)
  118. +if (!self.player_status) {                    //#jp#(PlayerStatus)
  119. +   PlayerStatusSetFlag(self,PLAYER_IS_CLIENT);            //#jp#(PlayerStatus)
  120. +   if (USE_MODULE_OBSERVER) {                    //#jp#(Observer)
  121. +      self.observer_status = OBSERVER_BECOME_OBSERVER;        //#jp#(Observer)
  122. +   }                                //#jp#(Observer)
  123. +}                                //#jp#(PlayerStatus)
  124. +if (self.player_status & PLAYER_IS_OBSERVER) {            //#jp#(Observer)
  125. +   // happens after level change                //#jp#(Observer)
  126. +   if (!(self.items & IT_AXE)) {                //#jp#(Observer)
  127. +      //dprint("PutClientInServer: stay observer after level change\n");//#jp#(debug)
  128. +      self.observer_status = OBSERVER_BECOME_OBSERVER;        //#jp#(Observer)
  129. +   }                                //#jp#(Observer)
  130. +}                                //#jp#(Observer)
  131. +
  132.      spot = SelectSpawnPoint ();
  133. +if (!(self.observer_status & OBSERVER_BECOME_OBSERVER)) {    //#jp#(Observer)
  134. +   spot = TelefragSelectSpawnPoint(spot);            //#jp#(Telefrag)
  135. +}                                //#jp#(Observer)
  136.  
  137.      self.origin = spot.origin + '0 0 1';
  138.      self.angles = spot.angles;
  139. @@ -492,6 +540,14 @@
  140.      setmodel (self, "progs/player.mdl");
  141.      modelindex_player = self.modelindex;
  142.  
  143. +if (self.observer_status & OBSERVER_BECOME_OBSERVER) {        //#jp#(Observer)
  144. +   //dprint("PutClientInServer: becoming observer\n");        //#jp#(debug)
  145. +   ObserverBecomeObserver(self);                //#jp#(Observer)
  146. +   PlayerStatusSetFlag(self,PLAYER_IS_OBSERVER);        //#jp#(Observer)
  147. +   return;                            //#jp#(Observer)
  148. +}                                //#jp#(Observer)
  149. +   //dprint("PutClientInServer: spawning player regularly\n");    //#jp#(debug)
  150. +
  151.      setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);
  152.      
  153.      self.view_ofs = '0 0 22';
  154. @@ -737,6 +793,8 @@
  155.          return;
  156.      }
  157.  
  158. +   if (ObserverDeathThink()) return;    //#jp#(Observer)
  159. +
  160.  // wait for any button down
  161.      if (!self.button2 && !self.button1 && !self.button0)
  162.          return;
  163. @@ -812,10 +870,12 @@
  164.  
  165.      if (self.waterlevel != 3)
  166.      {
  167. +if (!(self.player_status & PLAYER_IS_OBSERVER)) {//#jp#(Observer)
  168.          if (self.air_finished < time)
  169.              sound (self, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM);
  170.          else if (self.air_finished < time + 9)
  171.              sound (self, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM);
  172. +}//#jp#(Observer)
  173.          self.air_finished = time + 12;
  174.          self.dmg = 2;
  175.      }
  176. @@ -948,6 +1008,53 @@
  177.          return;
  178.      }
  179.      
  180. +        if (time > vote_checktime) {                    //#jp#(Vote)
  181. +           VoteThink();                            //#jp#(Vote)
  182. +        }                                //#jp#(Vote)
  183. +        if (!(self.player_status & PLAYER_PASSED_INIT_PHASE)) {        //#jp#(PlayerStatus)
  184. +           if (!(self.player_status & PLAYER_IS_INITIALIZED)) {        //#jp#(PlayerStatus)
  185. +              ModulesInitModules(self);                    //#jp#(Modules)
  186. +              if (USE_MODULE_OBSERVER) {                //#jp#(Observer)
  187. +                 sound (self, CHAN_BODY, "wizard/wsight.wav", 1, ATTN_NONE);//#jp#(Observer)
  188. +              }                                //#jp#(Observer)
  189. +              self.player_status_init_time = time;            //#jp#(PlayerStatus)
  190. +              PlayerStatusSetFlag(self,PLAYER_IS_INITIALIZED);        //#jp#(PlayerStatus)
  191. +           }                                //#jp#(PlayerStatus)
  192. +           if (!(self.player_status & PLAYER_DID_INIT_CALLS)) {        //#jp#(Init)
  193. +              if (time > self.player_status_init_time + 1) {        //#jp#(Init)
  194. +                 InitLetClientExecInit(self);                //#jp#(Init)
  195. +                 PlayerStatusSetFlag(self,PLAYER_DID_INIT_CALLS);    //#jp#(Init)
  196. +              }                                //#jp#(Init)
  197. +           }                                //#jp#(Init)
  198. +           if (!(self.player_status & PLAYER_PASSED_MOTD)) {        //#jp#(Motd)
  199. +              MotdThink();                        //#jp#(Motd)
  200. +           }                                //#jp#(Motd)
  201. +           if (time > self.player_status_init_time + 10) {        //#jp#(PlayerStatus)
  202. +              PlayerStatusSetFlag(self,PLAYER_PASSED_INIT_PHASE);    //#jp#(PlayerStatus)
  203. +           }                                //#jp#(PlayerStatus)
  204. +        }                                //#jp#(PlayerStatus)
  205. +        if (self.modules_level_inited != 2) {                //#jp#(Modules)
  206. +           if (!self.modules_level_inited) {                //#jp#(Modules)
  207. +              if (USE_MODULE_OBSERVER) {                //#jp#(Observer)
  208. +                 bprint (self.netname);                    //#jp#(Observer)
  209. +                 bprint (" entered the game\n");            //#jp#(Observer)
  210. +              }                                //#jp#(Observer)
  211. +              if (!exitrules_inited) { ExitRulesSetValues(); }        //#jp#(ExitRules)
  212. +              self.modules_level_entertime = time;            //#jp#(Modules)
  213. +              self.modules_level_inited = 1;                //#jp#(Modules)
  214. +           }                                //#jp#(Observer)
  215. +           if (time - self.modules_level_entertime > 2) {        //#jp#(Modules)
  216. +              if (self.player_status & PLAYER_PASSED_INIT_PHASE) {    //#jp#(PlayerStatus)
  217. +                 ModulesShowLevelInfo(self);                //#jp#(Modules)
  218. +                 self.modules_level_inited = 2;                //#jp#(Modules)
  219. +              }                                //#jp#(PlayerStatus)
  220. +           }                                //#jp#(Modules)
  221. +        }                                //#jp#(Modules)
  222. +        if (self.player_status & PLAYER_IS_OBSERVER) {            //#jp#(Observer)
  223. +           ObserverThink();                        //#jp#(Observer)
  224. +           return;                            //#jp#(Observer)
  225. +        }                                //#jp#(Observer)
  226. +
  227.      if (self.deadflag == DEAD_DYING)
  228.          return;    // dying, so do nothing
  229.  
  230. @@ -1173,9 +1280,12 @@
  231.  */
  232.  void() ClientConnect =
  233.  {
  234. +if (!USE_MODULE_OBSERVER) {//#jp#(Observer)
  235.      bprint (self.netname);
  236.      bprint (" entered the game\n");
  237. +}//#jp#(Observer)
  238.      
  239. +        ServerConsolePlayerEntered(self); //#jp#(ServerConsole)
  240.  // a client connecting during an intermission can cause problems
  241.      if (intermission_running)
  242.          ExitIntermission ();
  243. @@ -1203,6 +1313,7 @@
  244.      bprint (" frags\n");
  245.      sound (self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE);
  246.      set_suicide_frame ();
  247. +    PlayerStatusSetFlag(self,PLAYER_DISCONNECTED); //#jp#(PlayerStatus)
  248.  };
  249.  
  250.  /*
  251. @@ -1218,6 +1329,9 @@
  252.      local    string deathstring, deathstring2;
  253.      rnum = random();
  254.  
  255. +    RankClientObituary(targ,attacker); //#jp#(Rank)
  256. +    ServerConsoleClientObituary(targ,attacker); //#jp#(ServerConsole)
  257. +
  258.      if (targ.classname == "player")
  259.      {
  260.          if (attacker.classname == "teledeath")
  261. @@ -1247,6 +1361,12 @@
  262.              {
  263.                  // killed self
  264.                  attacker.frags = attacker.frags - 1;
  265. +if (targ.exitrules_death) {        //#jp#(ExitRules)
  266. +   if (USE_MODULE_EXITRULES) {        //#jp#(ExitRules)
  267. +      ExitRulesClientObituary(targ);    //#jp#(ExitRules)
  268. +      return;                //#jp#(ExitRules)
  269. +   }                    //#jp#(ExitRules)
  270. +}                    //#jp#(ExitRules)
  271.                  bprint (targ.netname);
  272.                  
  273.                  if (targ.weapon == 64 && targ.waterlevel > 1)
  274. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/items.qc qc/items.qc
  275. --- qc-ori/items.qc    Sat Aug 17 00:00:00 1996
  276. +++ qc/items.qc    Sat Sep  7 00:00:00 1996
  277. @@ -168,10 +168,12 @@
  278.              return;
  279.      }
  280.      
  281. +     if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_HEALTH) { //#jp#(Messages)
  282.      sprint(other, "You receive ");
  283.      s = ftos(self.healamount);
  284.      sprint(other, s);
  285.      sprint(other, " health\n");
  286. +     }                    //#jp#(Messages)
  287.      
  288.  // health touch sound
  289.      sound(other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
  290. @@ -275,6 +277,7 @@
  291.          self.nextthink = time + 20;
  292.      self.think = SUB_regen;
  293.  
  294. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_ARMOR) //#jp#(Messages)
  295.      sprint(other, "You got armor\n");
  296.  // armor touch sound
  297.      sound(other, CHAN_ITEM, "items/armor1.wav", 1, ATTN_NORM);
  298. @@ -460,9 +463,11 @@
  299.      else
  300.          objerror ("weapon_touch: unknown classname");
  301.  
  302. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_WEAPON) {//#jp#(Messages)
  303.      sprint (other, "You got the ");
  304.      sprint (other, self.netname);
  305.      sprint (other, "\n");
  306. +    }//#jp#(Messages)
  307.  // weapon touch sound
  308.      sound (other, CHAN_ITEM, "weapons/pkup.wav", 1, ATTN_NORM);
  309.      stuffcmd (other, "bf\n");
  310. @@ -645,9 +650,11 @@
  311.  
  312.      bound_other_ammo ();
  313.      
  314. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_AMMO) {//#jp#(Messages)
  315.      sprint (other, "You got the ");
  316.      sprint (other, self.netname);
  317.      sprint (other, "\n");
  318. +    }//#jp#(Messages)
  319.  // ammo touch sound
  320.      sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
  321.      stuffcmd (other, "bf\n");
  322. @@ -879,9 +886,11 @@
  323.      if (other.items & self.items)
  324.          return;
  325.  
  326. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_KEY) {//#jp#(Messages)
  327.      sprint (other, "You got the ");
  328.      sprint (other, self.netname);
  329.      sprint (other,"\n");
  330. +    }//#jp#(Messages)
  331.  
  332.      sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
  333.      stuffcmd (other, "bf\n");
  334. @@ -1086,9 +1095,11 @@
  335.      if (other.health <= 0)
  336.          return;
  337.  
  338. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_POWERUP) {//#jp#(Messages)
  339.      sprint (other, "You got the ");
  340.      sprint (other, self.netname);
  341.      sprint (other,"\n");
  342. +    }//#jp#(Messages)
  343.  
  344.      if (deathmatch)
  345.      {
  346. @@ -1254,6 +1265,7 @@
  347.      
  348.      bound_other_ammo ();
  349.  
  350. +    if (!USE_MODULE_MESSAGES || messages_flag & MESSAGES_BACKPACK) {//#jp#(Messages)
  351.      sprint (other, "You get ");
  352.  
  353.      if (self.ammo_shells)
  354. @@ -1282,6 +1294,8 @@
  355.      }
  356.      
  357.      sprint (other, "\n");
  358. +    }//#jp#(Messages)
  359. +
  360.  // backpack touch sound
  361.      sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
  362.      stuffcmd (other, "bf\n");
  363. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/progs.src qc/progs.src
  364. --- qc-ori/progs.src    Sat Aug 17 00:00:00 1996
  365. +++ qc/progs.src    Sat Sep  7 00:00:00 1996
  366. @@ -1,6 +1,24 @@
  367.  ../progs.dat
  368.  
  369.  defs.qc
  370. +
  371. +_modules.qh
  372. +_plystat.qh
  373. +_exitrls.qh
  374. +_init.qh
  375. +_kckscdr.qh
  376. +_levsel.qh
  377. +_lightng.qh
  378. +_message.qh
  379. +_motd.qh
  380. +_rank.qh
  381. +_skin.qh
  382. +_observe.qh
  383. +_servhlp.qh
  384. +_servcon.qh
  385. +_telefrg.qh
  386. +_vote.qh
  387. +
  388.  subs.qc
  389.  fight.qc
  390.  ai.qc
  391. @@ -33,3 +51,22 @@
  392.  shalrath.qc        // registered
  393.  enforcer.qc        // registered
  394.  oldone.qc        // registered
  395. +
  396. +_plystat.qc
  397. +_exitrls.qc
  398. +_init.qc
  399. +_kckscdr.qc
  400. +_levsel.qc
  401. +_lightng.qc
  402. +_message.qc
  403. +_modules.qc
  404. +_motd.qc
  405. +_observe.qc
  406. +_skin.qc
  407. +_rank.qc
  408. +_servcon.qc
  409. +_servhlp.qc
  410. +_telefrg.qc
  411. +_vote.qc
  412. +
  413. +
  414. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/weapons.qc qc/weapons.qc
  415. --- qc-ori/weapons.qc    Sat Aug 17 00:00:00 1996
  416. +++ qc/weapons.qc    Sat Sep  7 00:00:00 1996
  417. @@ -471,6 +471,20 @@
  418.          return;
  419.      }
  420.  
  421. +   if (USE_MODULE_LIGHTNING) {                //#jp#(Lightning)
  422. +      if (self.waterlevel > 2) {            //#jp#(Lightning)
  423. +         if (USE_MODULE_LIGHTNING) {            //#jp#(Lightning)
  424. +            local float ddd;                //#jp#(Lightning)
  425. +            ddd = 20*self.ammo_cells;            //#jp#(Lightning)
  426. +            if (ddd > 400) ddd = 400;            //#jp#(Lightning)
  427. +            T_RadiusDamage (self, self, ddd, world);    //#jp#(Lightning)
  428. +            self.ammo_cells = 0;            //#jp#(Lightning)
  429. +            W_SetCurrentAmmo ();            //#jp#(Lightning)
  430. +            return;                    //#jp#(Lightning)
  431. +         }                        //#jp#(Lightning)
  432. +      }                            //#jp#(Lightning)
  433. +   }                            //#jp#(Lightning)
  434. +   else {                        //#jp#(Lightning)
  435.  // explode if under water
  436.      if (self.waterlevel > 1)
  437.      {
  438. @@ -479,12 +493,15 @@
  439.          W_SetCurrentAmmo ();
  440.          return;
  441.      }
  442. +   }                            //#jp#(Lightning)
  443.  
  444. +   if (!USE_MODULE_LIGHTNING) {                //#jp#(Lightning)
  445.      if (self.t_width < time)
  446.      {
  447.          sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
  448.          self.t_width = time + 0.6;
  449.      }
  450. +   }                            //#jp#(Lightning)
  451.      self.punchangle_x = -2;
  452.  
  453.      self.currentammo = self.ammo_cells = self.ammo_cells - 1;
  454. @@ -493,6 +510,30 @@
  455.      
  456.      traceline (org, org + v_forward*600, TRUE, self);
  457.  
  458. +   if (USE_MODULE_LIGHTNING) {                //#jp#(Lightning)
  459. +      local float ddd, sss;
  460. +      if (self.lightning_sound_lasttime < 0) sss = 1;
  461. +      else if (self.lightning_sound_nexttime < time) sss = 1;
  462. +      if (self.lightning_sound_lasttime + 0.1 <= time) {
  463. +         ddd = vlen(trace_endpos - self.lightning_target);
  464. +         if (ddd > 10) {
  465. +            if (random() > 0.3) sss = 2;
  466. +         }
  467. +      }
  468. +      if (sss) {
  469. +         if (sss == 2) {
  470. +            sound (self, CHAN_WEAPON, "weapons/lstart.wav", 1, ATTN_NORM);
  471. +            self.lightning_sound_nexttime = time + 0.6;
  472. +         }
  473. +         else if (sss == 1) {
  474. +            sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
  475. +            self.lightning_sound_nexttime = time + 0.6;
  476. +         }
  477. +         self.lightning_sound_lasttime = time;
  478. +         self.lightning_target = trace_endpos;
  479. +      }
  480. +   }
  481. +
  482.      WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  483.      WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
  484.      WriteEntity (MSG_BROADCAST, self);
  485. @@ -940,6 +981,7 @@
  486.      {
  487.          player_light1();
  488.          self.attack_finished = time + 0.1;
  489. +        self.lightning_sound_lasttime = -1;//#jp#(Lightning)
  490.          sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
  491.      }
  492.  };
  493. @@ -954,6 +996,8 @@
  494.  {
  495.      local    float    it, am, fl;
  496.      
  497. +    if (self.player_status & PLAYER_IS_OBSERVER) return; //#jp#(Observer)
  498. +
  499.      it = self.items;
  500.      am = 0;
  501.      
  502. @@ -1066,6 +1110,15 @@
  503.  void() CycleWeaponCommand =
  504.  {
  505.      local    float    it, am;
  506. +
  507. +    // Once I observed a 'runaway loop error'    //#jp#(Bugfix)
  508. +    // in this routine. I don't understand        //#jp#(Bugfix)
  509. +    // what it really caused, but to avoid it in    //#jp#(Bugfix)
  510. +    // the future the lines marked 'Bugfix'     //#jp#(Bugfix)
  511. +    // have been added to this routine.         //#jp#(Bugfix)
  512. +    local float weapon_old;              //#jp#(Bugfix)
  513. +    weapon_old = self.weapon;              //#jp#(Bugfix)
  514. +    if (self.player_status & PLAYER_IS_OBSERVER) return; //#jp#(Observer)
  515.      
  516.      it = self.items;
  517.      self.impulse = 0;
  518. @@ -1126,6 +1179,12 @@
  519.              W_SetCurrentAmmo ();
  520.              return;
  521.          }
  522. +        if (weapon_old == self.weapon) {    //#jp#(Bugfix)
  523. +           dprint("CycleWeaponCommand: warning: avoiding runaway loop error caused by ");//#jp#(Bugfix)
  524. +           dprint(self.netname);        //#jp#(Bugfix)
  525. +           dprint("\n");            //#jp#(Bugfix)
  526. +           return;                //#jp#(Bugfix)
  527. +        }                    //#jp#(Bugfix)
  528.      }
  529.  
  530.  };
  531. @@ -1160,6 +1219,8 @@
  532.  */
  533.  void() ImpulseCommands =
  534.  {
  535. +   if (self.impulse) {                        //#jp#(Modules)
  536. +
  537.      if (self.impulse >= 1 && self.impulse <= 8)
  538.          W_ChangeWeapon ();
  539.  
  540. @@ -1172,6 +1233,62 @@
  541.  
  542.      if (self.impulse == 255)
  543.          QuadCheat ();
  544. +
  545. +        if (self.impulse >= 200) {                //#jp#(Modules)
  546. +           if (self.impulse == 200) {                //#jp#(Skin)
  547. +          if (USE_MODULE_SKIN) SkinUseOtherSkin(self,1);    //#jp#(Skin)
  548. +           }                            //#jp#(Skin)
  549. +           else if (self.impulse == 201) {            //#jp#(Skin)
  550. +          if (USE_MODULE_SKIN) SkinUseOtherSkin(self,(-1));    //#jp#(Skin)
  551. +           }                            //#jp#(Skin)
  552. +           else if (self.impulse == 202) {            //#jp#(Skin)
  553. +          if (USE_MODULE_SKIN) SkinHelp(self);        //#jp#(Skin)
  554. +           }                            //#jp#(Skin)
  555. +           else if (self.impulse == 203) {            //#jp#(Rank)
  556. +              if (USE_MODULE_RANK) RankDumpRanksToConsole(self);//#jp#(Rank)
  557. +           }                            //#jp#(Rank)
  558. +           else if (self.impulse == 204) {            //#jp#(Rank)
  559. +              if (USE_MODULE_RANK) RankHelp(self);        //#jp#(Rank)
  560. +           }                            //#jp#(Rank)
  561. +           else if (self.impulse == 205) {            //#jp#(Observer)
  562. +              if (USE_MODULE_OBSERVER) ObserverHelp(self);    //#jp#(Observer)
  563. +           }                            //#jp#(Observer)
  564. +           else if (self.impulse == 206) {            //#jp#(Observer)
  565. +              if (USE_MODULE_OBSERVER) ObserverNoclip(self);    //#jp#(Observer)
  566. +           }                            //#jp#(Observer)
  567. +           else if (self.impulse == 207) {            //#jp#(ServerHelp)
  568. +              if (USE_MODULE_SERVERHELP) ServerHelpShowHelp(self);//#jp#(ServerHelp)
  569. +           }                            //#jp#(ServerHelp)
  570. +           else if (self.impulse == 208) {            //#jp#(Init)
  571. +              if (InitCallIsPermitted(self)) {            //#jp#(Init)
  572. +                 stuffcmd(self,"init;\n");            //#jp#(Init)
  573. +              }                            //#jp#(Init)
  574. +           }                            //#jp#(Init)
  575. +           else if (self.impulse == 209) {            //#jp#(Init)
  576. +              if (InitCallIsPermitted(self)) {            //#jp#(Init)
  577. +             if (USE_MODULE_SKIN) {                //#jp#(Skin)
  578. +                    SkinQuietlyUseOtherSkin(self,1);        //#jp#(Skin)
  579. +                 }                        //#jp#(Skin)
  580. +                 stuffcmd(self,"init;\n");            //#jp#(Init)
  581. +              }                            //#jp#(Init)
  582. +           }                            //#jp#(Init)
  583. +           else if (self.impulse == 210) {            //#jp#(ExitRules)
  584. +              if (USE_MODULE_EXITRULES) ExitRulesHelp(self);    //#jp#(ExitRules)
  585. +           }                            //#jp#(ExitRules)
  586. +           else if (self.impulse == 211) {            //#jp#(VoteExit)
  587. +              if (USE_MODULE_VOTE) VoteHelp(self);        //#jp#(Vote)
  588. +           }                            //#jp#(Vote)
  589. +           else if (self.impulse == 212) {            //#jp#(VoteExit)
  590. +              if (USE_MODULE_VOTE) VoteShowVotes(self);        //#jp#(Vote)
  591. +           }                            //#jp#(Vote)
  592. +           else if (self.impulse == 213) {            //#jp#(Vote)
  593. +              if (USE_MODULE_VOTE) VoteExitVote(self);        //#jp#(Vote)
  594. +           }                            //#jp#(Vote)
  595. +           else if (self.impulse == 214) {            //#jp#(Vote)//#jp#(ExitRules)
  596. +              if (USE_MODULE_VOTE) VoteExitRulesVote(self);    //#jp#(Vote)//#jp#(ExitRules)
  597. +           }                            //#jp#(Vote)//#jp#(ExitRules)
  598. +        }                            //#jp#(Modules)
  599. +   }                                //#jp#(Modules)
  600.          
  601.      self.impulse = 0;
  602.  };
  603. diff -ur -x qcc -x *.exe -x *.list -x *.pl -x *.h qc-ori/world.qc qc/world.qc
  604. --- qc-ori/world.qc    Sat Aug 17 00:00:00 1996
  605. +++ qc/world.qc    Sat Sep  7 00:00:00 1996
  606. @@ -254,6 +254,10 @@
  607.      precache_sound ("misc/water1.wav");            // swimming
  608.      precache_sound ("misc/water2.wav");            // swimming
  609.  
  610. +if (USE_MODULE_OBSERVER) {            //#jp#(Observer)
  611. +    precache_sound ("wizard/wsight.wav");    //#jp#(Observer)
  612. +}                        //#jp#(Observer)
  613. +
  614.      precache_model ("progs/player.mdl");
  615.      precache_model ("progs/eyes.mdl");
  616.      precache_model ("progs/h_player.mdl");
  617. @@ -377,6 +381,7 @@
  618.  // respawned elsewhere
  619.  void(entity ent) CopyToBodyQue =
  620.  {
  621. +    bodyque_head.skin = ent.skin; //#jp#(Skin)
  622.      bodyque_head.angles = ent.angles;
  623.      bodyque_head.model = ent.model;
  624.      bodyque_head.modelindex = ent.modelindex;
  625.